import request from "@/utils/request";

/**
 * 处理 JSON-RPC 响应，提取数据或抛出错误
 * @param {Object} response Axios 响应对象
 * @returns {Object} 成功响应的 data 部分
 * @throws {Error} 如果响应包含错误
 */
function handleResponse(response) {
  if (response?.data?.error) {
    console.error("API Error:", response.data.error);
    throw new Error(response.data.error.message || 'API 请求失败');
  }
  // 检查 result 是否存在并且有 code 字段
  if (response?.data?.result?.code === 200) {
    return response.data.result.data; // 返回成功响应的数据部分
  }
  // 兼容直接返回 result 数据的情况（例如修改密码成功时 data 为空对象）
  if (response?.data?.result && response?.data?.result?.code === undefined && typeof response.data.result === 'object') {
      return response.data.result;
  }
  // 未知错误或非预期格式
  console.error("Unexpected API response format:", response?.data);
  throw new Error('API 响应格式错误或非预期结果');
}

/**
 * 获取用户列表
 * @param {Object} params 查询参数
 * @param {number} params.page 页码
 * @param {number} params.page_size 每页数量
 * @param {string} [params.role] 角色过滤 (可选)
 * @returns {Promise<Object>} 用户列表及分页信息 { total, page, page_size, users }
 */
export async function getUsers(params = {}) {
  try {
    const response = await request.post("/v1/jsonrpc2", {
      id: Date.now().toString(), // 使用时间戳作为简单 ID
      method: "users.getList",
      params: {
        page: params.page || 1,
        page_size: params.page_size || 20,
        ...(params.role && { role: params.role }) // 如果提供了 role，则添加到参数中
      }
    });
    return handleResponse(response);
  } catch (error) {
    console.error("获取用户列表失败:", error);
    // 重新抛出处理过的错误或原始错误
    throw error instanceof Error ? error : new Error('获取用户列表失败');
  }
}

/**
 * 创建新用户
 * @param {Object} userData 用户数据
 * @param {string} userData.username 用户名
 * @param {string} userData.password 密码
 * @param {string} userData.role 角色 (默认 'user'，但后端需要明确指定)
 * @returns {Promise<Object>} 创建的用户信息 { username, role, status }
 */
export async function createUser(userData) {
  try {
    const response = await request.post("/v1/jsonrpc2", {
      id: Date.now().toString(),
      method: "users.create",
      params: {
        username: userData.username,
        password: userData.password,
        role: userData.role || 'user' // 确保传递了角色
      }
    });
    return handleResponse(response);
  } catch (error) {
    console.error("创建用户失败:", error);
    throw error instanceof Error ? error : new Error('创建用户失败');
  }
}

/**
 * 更新用户信息
 * @param {string} username 要更新的用户名
 * @param {Object} updateData 要更新的数据
 * @param {string} [updateData.role] 新角色 (可选)
 * @param {string} [updateData.status] 新状态 ('active'/'disabled') (可选)
 * @returns {Promise<Object>} 更新后的用户信息 { username, role, status }
 */
export async function updateUser(username, updateData) {
  try {
    // 构建 params，只包含需要更新的字段
    const params = { username };
    if (updateData.role) {
      params.role = updateData.role;
    }
    if (updateData.status) {
      params.status = updateData.status;
    }

    // 如果没有要更新的字段，可以提前返回或抛出错误
    if (Object.keys(params).length <= 1) {
        console.warn("没有提供要更新的用户信息");
        // 可以选择直接返回，或者根据业务需要抛错
        // return { username, ...updateData }; // 模拟成功返回
        // 查找用户信息并返回作为模拟成功
        const usersData = await getUsers({ page: 1, page_size: 1000 }); // 获取所有用户来查找
        const currentUser = usersData?.users?.find(u => u.username === username);
        return currentUser || {};
    }


    const response = await request.post("/v1/jsonrpc2", {
      id: Date.now().toString(),
      method: "users.update",
      params: params
    });
    return handleResponse(response);
  } catch (error) {
    console.error(`更新用户 ${username} 失败:`, error);
    throw error instanceof Error ? error : new Error('更新用户失败');
  }
}

/**
 * 删除用户
 * @param {string} username 要删除的用户名
 * @returns {Promise<Object>} 被删除的用户信息 { username }
 */
export async function deleteUser(username) {
  try {
    const response = await request.post("/v1/jsonrpc2", {
      id: Date.now().toString(),
      method: "users.delete",
      params: { username }
    });
    return handleResponse(response);
  } catch (error) {
    console.error(`删除用户 ${username} 失败:`, error);
    throw error instanceof Error ? error : new Error('删除用户失败');
  }
}

/**
 * 修改用户密码
 * @param {string} username 用户名
 * @param {string} oldPassword 旧密码
 * @param {string} newPassword 新密码
 * @returns {Promise<Object>} 空对象 {}
 */
export async function changePassword(username, oldPassword, newPassword) {
  try {
    const response = await request.post("/v1/jsonrpc2", {
      id: Date.now().toString(),
      method: "users.changePassword",
      params: {
        username: username,
        old_password: oldPassword,
        new_password: newPassword
      }
    });
    // 修改密码成功时，result.data 预期为空对象 {}
    // handleResponse 需要能处理这种情况
    return handleResponse(response);
  } catch (error) {
    console.error(`用户 ${username} 修改密码失败:`, error);
    throw error instanceof Error ? error : new Error('修改密码失败');
  }
} 